#ifndef __FUNCTIONS_H__
#define __FUNCTIONS_H__

#include "ImageGray.h"
#include "Point.h"
#include "Region.h"
#include "RegLinks.h"


using namespace Torch;

class Functions {

    public :

        //CONSTRUCTEUR: création d'une image Functions
	Functions(Image *source,int iSeuil1,int iSeuil2,char *col);

	//Permet de fusioner les différentes parties de l'image
	void Merge(char *type);


	//Affiche l'image pixel par pixel
	// =>en couleur
	void Afficher_RGB(Image *outImage);

        
	//Divise l'image en regions homogenes
	void Split(char *type);

        
	//Liberation de l'espace alloué aux tableaux
	void FreeTab();

        int Mini (int a, int b){ return (a<b)?a:b; };
        int Maxi (int a, int b){ return (a>b)?a:b; };

    private:

	//matrice des couleurs et de localisation des régions
	int **colRed,**colGreen,**colBlue,**colGris,**colSelect,**LabelImage;

	int NbLiaison;				//nombre de liaison créer dans le graph
	int NbRegion;				//nombre de region crée pendant la division
	int Width,Height;			//taille de l'image
	int Seuil1,Seuil2;			//finesse de la division réglé par seuil1
						//nombre de region final reglé par seuil2

	//racine de l'arbre des regions
	Region *racine;

	//liste chainé comprennant les liaisons du graph
	vector<RegLinks*>Graph;

	//liste chainé permettant de stocker temporairement les regions
	vector<Region*>RegionTmp;


	//fonction permettant de diviser l'image initiale en region
	//fonction recursive prennant comme parametre les 2 pixels formant la region
	void Division(Region *zone, Point P1,Point P2,char *type);

	double getCritere(Region *zone, Point P1,Point P2,char *type);
	//fonction recursive permettant de mettre a jours les tableaux de couleur après
	//la segmentation
	void Sauvegarde_Image(Region *zone);

	//Fonctions nécessaire à la fusion
	void Creation_Voisin(Region *zone);
	void Creation_Graph(Region *zone);
	int  DetMin(char *);
	void Fusion(int NumLiaison);

	//Libération l'espace alloué
	void FreeTree(Region *zone);
	void FreeGraph();

	int **Allocation();
	void Desallocation(int **tab);

	};

char * setTitle(char* string,char* prefix);

Image * loadImage(bool verbose,char* image_filename);

void saveImage(Image *InImage, char *name);



// prototypes des fonctions définies dans TPFunctions.cc


#endif  // __TPFUNCTIONS_H__
